package com.cium.aqie.begin

/**
 * @Function: Function2
 * @Author: aqie
 * @Date: 2019/8/27 16:42
 *
 */
/**
 * 没有返回值 返回Uint(类似 void)
 */
fun main(args: Array<String>):Unit{
    checkArgs(args)
    val arg1 = args[0].toInt()
    val arg2 = args[1].toInt()
    println("$arg1 + $arg2 = ${sum(arg1, arg2)}")
    println(sumLambda.invoke(1, 2))
    // for (i in args) print(i)
    args.forEach { print(it) }
    /**
     * 1, 参数最后一个是lambda表达式, 大括号可以移到小括号外面
     * 2. 只有一个参数lambda 括号没内容可以删掉
     * 3. 传入函数和需要接收lambda表达式一样，
     * 4. lambda 只有一个参数可以默认it
     * 5. 入参，返回值与形参一致的函数可以用函数引用方式作实参传入
     */
    args.forEach ({it -> print(it)})
    println("begin")
    args.forEach ForEach@{
        // 这里 return 的是main函数
        // if (it == "3") return
        if (it == "3") return@ForEach
        println(it)
    }
    println("The end")
    args.forEach (::print)

    // 打印匿名函数类型
    println(sumLambda)
    println(::printUsage is () -> Unit)
    println(::sum)
}


fun sum (a:Int, b:Int): Int{
    return a + b
}


fun checkArgs(args: Array<String>) {
    if (args.size != 2) {
        printUsage()
        System.exit(-1)     // oxff  255
    }
}

fun printUsage() {
    println("请传入两个整型参数，例如 1 2") // (Any?) -> Unit

} // ()->Unit

// 必须用变量接收匿名函数
val sumLambda = { arg1: Int, arg2: Int ->
    arg1 + arg2
}

// 匿名函数
val printlnHello = {
    println("Hello")
}
// ()-> Unit

